#include "tga.hpp"

Tga::Tga(const unsigned int _height,const unsigned int _width) {
	height = _height;
	width = _width;

	line_size = width * 3;
	size = height * line_size;

	dados = new char[size];
}

/*Tga::~Tga(void)
{
	delete dados;
}*/


void Tga::set_pixel(unsigned int px,unsigned int py,const Color& _color) {
	double r = _color.get_r();
	double g = _color.get_g();
	double b = _color.get_b();
	
	
	if (px > width-1) px = width-1;
	
	if (py > height-1) py = height-1;
	
	int offset = py*line_size + px*3;
	
	int ir = (int) (r * 255.0);
	int ig = (int) (g * 255.0);
	int ib = (int) (b * 255.0);

	char cr,cg,cb;
	
	cr = max(0,min(ir,255));
	cg = max(0,min(ig,255));		
	cb = max(0,min(ib,255));
	
	
	dados[ offset + 0 ] = cr;
	dados[ offset + 1 ] = cg;
	dados[ offset + 2 ] = cb;
}

void Tga::save_file(const char* _arq) {
	FILE *arquivo;
	arquivo = fopen(_arq,"w+b");
	putc(0,arquivo);
	putc(0,arquivo);
	putc(2,arquivo);/* RGB nao compactado*/
	putc(0,arquivo); putc(0,arquivo);
	putc(0,arquivo); putc(0,arquivo);
	putc(0,arquivo);
	putc(0,arquivo); putc(0,arquivo);/* Origem X */
	putc(0,arquivo); putc(0,arquivo);/* Origem y */
	putc((width & 0x00FF),arquivo);
	putc((width & 0xFF00) / 256,arquivo);
	putc((height & 0x00FF),arquivo);
	putc((height & 0xFF00) / 256,arquivo);
	putc(24,arquivo); /* 24 bit bitmap */
	putc(0,arquivo);

	/* Gravacao propriamente dita */
	//for (int y = height; y > 0; y--){
	int py,px;
	for(unsigned int y = 0;y < height; y++) {
		py = y*line_size;
		for (unsigned int x = 0; x < width; x++){
			px = x*3;
			putc((dados[py+px+2]),arquivo);
			putc((dados[py+px+1]),arquivo);
			putc((dados[py+px]),arquivo);
		}
	}
	fclose(arquivo);
}
